// 最小步数模型
#include <iostream>
#include <string>
#include <map>
#include <queue>
using namespace std;
// #define ONLINE_GUDGE
#define DEBUG

map<string, pair<string, char>> vis; // vis[s1].{s2, ch}: s2-(ch)->s1

inline string opA(string str) {
    for (int i = 0; i < 4; ++ i)    swap(str[i], str[7 - i]);
    return str;
}

inline string opB(string str) {
    for (int i = 0; i < 3; ++ i) swap(str[2 - i], str[3 - i]), swap(str[4 + i], str[5 + i]);
    return str;

}

inline string opC(string str) {
    swap(str[1], str[2]), swap(str[5], str[6]), swap(str[1], str[5]);
    return str;

}


void bfs(string start, string end)
{
    queue<string> q;
    q.push(start); // 保证字典序最小 必须start->end
    while(!q.empty())
    {
        auto t = q.front(); q.pop();
        if(t == end) return;

        vector<string> vs(3);

        vs[0] = opA(t);
        vs[1] = opB(t);
        vs[2] = opC(t);

        for(int i = 0; i < 3; i++)
        {
            if(!vis.count(vs[i])){ // 如果这个状态没有遍历过

                q.push(vs[i]);
                vis[vs[i]] = {t, 'A' + i}; // 状态存入
            }  
        }
    }
}

int main()
{

    #ifdef ONLINE_JUDGE

    #else
    freopen("./in.txt","r",stdin);
    #endif
    ios::sync_with_stdio(false);   
	cin.tie(0);

    int x;
    string start = "12345678", end, ans;
    
    // 扫描图
    for(int i = 0; i < 8; i++)
    {
        scanf("%d ", &x);
        end += x + '0';
    }    

    bfs(start, end);
    
    while(end != start) // 倒溯 end -> start
    {
        ans = vis[end].second + ans; // vis[end].first -(vis[end].second)-> end
        end = vis[end].first;
    }

    if(ans.length() == 0) printf("0\n");
    else printf("%d\n%s\n", ans.length(), ans.c_str());

    return 0;
}